<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
// 浅拷贝： 将原对象的引用直接赋给新对象，新对象只是原对象的一个引用，而不复制对象本身，新旧对象还是共享同一块内存

// 深拷贝： 创建一个新的对象和数组，将原对象的各项属性的“值”（数组的所有元素）拷贝过来，是“值”而不是“引用”，新对象跟原对象不共享内存，修改新对象不会改到原对象

// let obj1 = {
//     name:'刘德华',
//     age:40,
//     fn:function(){

//     },
    
// }
// let obj2 = JSON.parse(JSON.stringify(obj1))
// // console.log(obj2);
// obj2.name = '张学友'
// console.log(obj2);//拷贝函数 丢失
// console.log(obj1); //obj1和obj2互相影响  就是发生了浅拷贝


// let a = 10
// let b = a
// console.log(b);
// b = 20
// console.log(a);//深拷贝  赋值的是值 不是引用


// 把浅拷贝变成深拷贝  ？？ 深拷贝的方法 JSON.parse(JSON.stringify())


// let arr1 = ['11','22',undefined,Infinity]
// let arr2 = JSON.parse(JSON.stringify(arr1))
// arr2[0] = '我是修改后的'
// console.log(arr2);
// console.log(arr1);//修改arr2不会对arr1造成影响 ，但是JSON.parse(JSON.stringify())拷贝，undefined，Infinity的时候拷贝后的结果都变成了null



// 2.展开运算符  可以实现深拷贝，但是只能拷贝一层
// let list1 = [{name:'zs',eat:function(){}},'李四','18']

// let list2 = [...list1]
// // 修改李四 
// list2[1] = '李小四'
// list2[0].name = '张小三'
// console.log(list1);



// 总结        
// 对象深拷贝的方法    JSON.parse(JSON.stringify())    递归   展开运算符 （只能拷贝一层） Object.assign（拷贝一层）
// 数组深拷贝的方法    JSON.parse(JSON.stringify())   展开运算符（只能拷贝一层） ，【concat ,slice()】 只能拷贝一层  


// let person1  ={
//     name:'张三',
//     list:['11','22']
// }
// // let person2 = {...person1}
// let person2 =  Object.assign({},person1)
// person2.name = '张小三'
// person1.list[0] = '11111'
// console.log(person1);
// 展开运算符 深拷贝对象 （只能拷贝一层） Object.assign实现对象的深拷贝 只能拷贝一层


// 递归  实现深拷贝的方法

function deepCopy(obj){
  let newObj = null //用来存放你拷贝之后的内容
  if(typeof(obj)=='object' && obj !==null){
    // 判断传递过来的obj是不是数组 如果是数组  newObj = []  否则 newObj={}
    newObj = obj instanceof Array?[]:{}
    // 循环
    for(let i in obj){
        // obj[i]  遍历出来的对象的每一个属性值
        // 递归 调用自己
        newObj[i] =deepCopy(obj[i])
    }
  }else{
    newObj = obj
  }
  return newObj
}
// obj里面 有字符串类型 有数组类型  对象类型
let obj = {
    name:'赵丽颖',
    age:18,
    bubby:{
        a:'唱歌',
        b:'演戏',
        c:{
            d:'7777'
        }
    },
    list:[1,2,3,[44,55,66,[777]]],
    fn:function(){

    },
    aa:null,
    bb:undefined
}
let obj1 = deepCopy(obj)
obj1.bubby.a = '跳舞'
obj1.bubby.c.d = '88888'
obj1.list[1] = '红红火火恍恍惚惚'
console.log(obj);

 





 

</script>
</html>